package demo1;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import java.lang.annotation.Annotation;

/**
 * 使用Spring来管理项目中的类
 * IOC（反转控制 Inverse Of Control）
 * 意思是将原本由我们编写的程序自行控制要实例化的类，做初始化等动作的事情转交由Spring来完成
 * 将初始化的控制权反过来交给Spring容器管理的思想为IOC
 * 这样做的好处：繁琐的对象初始化操作可以由容器完成，让程序员更专注编写业务逻辑代码
 * 并且类与类之间的依赖关系由Spring容器管理，也无需我们再编写大量的反射代码。
 */
public class Demo {
    public static void main(String[] args) throws Exception {
        //需求：使用User类的sayHello方法
        //最开始我们的传统写法
        //优点：简单明了 缺点：代码写死了，将来换成其他类，这里需要修改代码
    /*
    基本概念：
    当一个类实现逻辑时需要调用另一个类的方法功能，那么可以说当前类与另一个存在“依赖关系”
    比如：A类逻辑中需要调用B类的方法完成功能，则A类依赖B类
    如果在A类中直接将B类的实例化写在A类的逻辑中，那么此时可以说：A与B是“强耦合”
     */
        User user = new User();
        user.sayHello();

        //后来：反射机制
        //优点：调用者与被调用不是写死在逻辑中，耦合关系被打断
        //缺点：编写大量的反射代码，在业务逻辑中掺杂了大量的反射
        Class cls=Class.forName("demo1.User");
        User user1=(User) cls.newInstance();
        user1.sayHello();

        //现在：Spring容器
        //优点：不再需要编写大量的反射代码来维护对象的创建工作 缺点：没什么缺点
        ///创建Spring提供的AnnotationConfigApplicationContext时需要指定管理的包
        //该包下所有类(被Spring提供的注解标注的类)和子孙包中的所有类(注解同理)都会被管理
        AnnotationConfigApplicationContext context=
                new AnnotationConfigApplicationContext("demo1");
        User user2=context.getBean(User.class);
        user2.sayHello();
    }
}
